package view;

import java.awt.Color;
import java.awt.Component;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JColorChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

import model.KISpieler;
import model.Spieler;

public class SpielerConfigPanel extends JPanel {
	private Spieler spieler;

	public SpielerConfigPanel(Spieler spieler) {
		super(new FlowLayout(FlowLayout.LEFT));

		this.spieler = spieler;

		init();
	}

	private void init() {
		final JTextField nameField = new JTextField(spieler.getName());
		nameField.getDocument().addDocumentListener(new DocumentListener() {

			@Override
			public void removeUpdate(DocumentEvent e) {
				updated();
			}

			@Override
			public void insertUpdate(DocumentEvent e) {
				updated();
			}

			@Override
			public void changedUpdate(DocumentEvent e) {
				updated();
			}

			private void updated() {
				spieler.setName(nameField.getText());
			}
		});
		nameField.setColumns(20);
		this.add(nameField);

		final JTextField leftField = new JTextField(spieler.getLeftKey() + "");
		leftField.getDocument().addDocumentListener(new DocumentListener() {

			@Override
			public void removeUpdate(DocumentEvent e) {
				updated();
			}

			@Override
			public void insertUpdate(DocumentEvent e) {
				updated();
			}

			@Override
			public void changedUpdate(DocumentEvent e) {
				updated();
			}

			private void updated() {
				if (leftField.getText().length() > 0)
					spieler.setLeftKey(leftField.getText().charAt(0));
			}
		});
		leftField.setColumns(2);
		this.add(leftField);

		final JTextField rightField = new JTextField(spieler.getRightKey() + "");
		rightField.getDocument().addDocumentListener(new DocumentListener() {

			@Override
			public void removeUpdate(DocumentEvent e) {
				updated();
			}

			@Override
			public void insertUpdate(DocumentEvent e) {
				updated();
			}

			@Override
			public void changedUpdate(DocumentEvent e) {
				updated();
			}

			private void updated() {
				if (rightField.getText().length() > 0)
					spieler.setRightKey(rightField.getText().charAt(0));
			}
		});
		rightField.setColumns(2);
		this.add(rightField);

		final JButton colorButton = new JButton();
		colorButton.setBackground(spieler.getFarbe());
		colorButton.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				Color newColor = JColorChooser.showDialog(
						SpielerConfigPanel.this, "Wähle eine Farbe für "
								+ spieler.getName(), spieler.getFarbe());
				if (newColor != null)
					spieler.setFarbe(newColor);
				colorButton.setBackground(spieler.getFarbe());
			}
		});
		colorButton.setIcon(new Icon() {

			@Override
			public void paintIcon(Component c, Graphics g, int x, int y) {
				g.setColor(c.getBackground());
				g.fillRect(x, y, getIconWidth(), getIconHeight());
			}

			@Override
			public int getIconWidth() {
				return 15;
			}

			@Override
			public int getIconHeight() {
				return 15;
			}
		});
		add(colorButton);

		final JCheckBox box = new JCheckBox("KI-Spieler",
				spieler instanceof KISpieler);
		box.addChangeListener(new ChangeListener() {
			@Override
			public void stateChanged(ChangeEvent e) {
				if (box.isSelected())
					spieler = new KISpieler(spieler.getName(), spieler
							.getFarbe(), spieler.getLeftKey(), spieler
							.getRightKey());
				else if (box.isSelected())
					spieler = new Spieler(spieler.getName(),
							spieler.getFarbe(), spieler.getLeftKey(), spieler
									.getRightKey());
			}
		});
		add(box);

		JButton removeSpieler = new JButton("Löschen");
		removeSpieler.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				JPanel parent = (JPanel) getParent();
				parent.remove(SpielerConfigPanel.this);
				JFrame frame = (JFrame) SwingUtilities
						.getWindowAncestor(parent);
				frame.pack();
			}
		});
		add(removeSpieler);
	}

	public Spieler getSpieler() {
		return spieler;
	}
}
